home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / c / saveu370.c < prev    next >
C/C++ Source or Header  |  1990-11-04  |  4KB  |  174 lines

  1. /*
  2. (c) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
  3. Copying of this file is authorized to users who have executed the true and
  4. proper "License Agreement for Kyoto Common LISP" with SIGLISP.
  5. */
  6.  
  7. /*
  8.     unixsave.c
  9. */
  10.  
  11.  
  12. #include <fcntl.h>
  13. #include <filehdr.h>
  14. #include <scnhdr.h>
  15. #ifdef u370
  16. #undef u370
  17. #include <aouthdr.h>
  18.  
  19. filecpy(to, from, n)
  20. FILE *to, *from;
  21. register int n;
  22. {
  23.     char buffer[BUFSIZ];
  24.  
  25.     for (;;)
  26.         if (n > BUFSIZ) {
  27.             fread(buffer, BUFSIZ, 1, from);
  28.             fwrite(buffer, BUFSIZ, 1, to);
  29.             n -= BUFSIZ;
  30.         } else if (n > 0) {
  31.             fread(buffer, 1, n, from);
  32.             fwrite(buffer, 1, n, to);
  33.             break;
  34.         } else
  35.             break;
  36. }
  37.  
  38.  
  39. memory_save(original_file, save_file)
  40. char *original_file, *save_file;
  41. {    MEM_SAVE_LOCALS;
  42.     struct scnhdr shdrs[15];
  43.     char *data_begin, *data_end;
  44.     int original_data;
  45.     FILE *original, *save;
  46.     register int n;
  47.     register char *p;
  48.     extern char *sbrk();
  49.     extern char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
  50.  
  51.     fclose(stdin);
  52.     original = fopen(original_file, "r");
  53.     if (stdin != original || original->_file != 0) {
  54.         fprintf(stderr, "Can't open the original file.\n");
  55.         exit(1);
  56.     }
  57.     setbuf(original, stdin_buf);
  58.     fclose(stdout);
  59.     unlink(save_file);
  60.     n = open(save_file, O_CREAT|O_WRONLY, 0777);
  61.     if (n != 1 || (save = fdopen(n, "w")) != stdout) {
  62.         fprintf(stderr, "Can't open the save file.\n");
  63.         exit(1);
  64.     }
  65.     setbuf(save, stdout_buf);
  66.  
  67.     /* READ_HEADER; */
  68.         fread(&fileheader, sizeof(fileheader), 1, original); 
  69.     fread(&header, fileheader.f_opthdr, 1, original);
  70.     fread(&shdrs[1],sizeof(sectionheader),fileheader.f_nscns,original);
  71.     data_begin = (char *) shdrs[2].s_paddr;
  72.     data_end = core_end; 
  73.     original_data = header.a_data; 
  74.     header.a_data = data_end - data_begin; 
  75.     diff = header.a_data - original_data; 
  76.     header.a_bss = sbrk(0) - core_end;  
  77.     fileheader.f_symptr += diff;
  78.     fwrite(&fileheader, sizeof(fileheader), 1, save);
  79.     fwrite(&header,fileheader.f_opthdr , 1, save);
  80.  
  81.      /* .text */
  82. #define INC_IF(x) if(x) x = x+diff;
  83.  
  84.      /* .data */
  85.     INC_IF(shdrs[2].s_size);
  86.     
  87.      /* .bss */
  88.     shdrs[3].s_paddr += diff;
  89.     shdrs[3].s_vaddr += diff;
  90.     shdrs[3].s_size = header.a_bss; 
  91.  
  92.     for (n = 1;  n <= fileheader.f_nscns;  n++) {
  93.           INC_IF(shdrs[n].s_lnnoptr);
  94.         if(n>=3) {INC_IF(shdrs[n].s_scnptr);}
  95.  
  96.     };
  97.     fwrite(&shdrs[1],sizeof(sectionheader),fileheader.f_nscns,save);
  98.  
  99.     filecpy(save,original,shdrs[2].s_scnptr - ftell(save));
  100.  
  101.     for (n = header.a_data, p = data_begin;  ;  n -= BUFSIZ, p += BUFSIZ)
  102.         if (n > BUFSIZ)
  103.             fwrite(p, BUFSIZ, 1, save);
  104.         else if (n > 0) {
  105.             fwrite(p, 1, n, save);
  106.             break;
  107.         } else
  108.             break;
  109.  
  110.     fseek(original, original_data, 1);
  111.  
  112.     COPY_TO_SAVE;
  113.  
  114.     fclose(original);
  115.     fclose(save);
  116. }
  117.  
  118. Lsave()
  119. {
  120.     char filename[256];
  121.  
  122.     check_arg(1);
  123.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  124.     coerce_to_filename(vs_base[0], filename);
  125.  
  126.     _cleanup();
  127. /*
  128.     {
  129.         FILE *p;
  130.         int nfile;
  131.  
  132.  
  133.         nfile = NUMBER_OPEN_FILES;
  134.  
  135.         for (p = &_iob[3];  p < &_iob[nfile];  p++)
  136.             fclose(p);
  137.     }
  138. */
  139.     memory_save(kcl_self, filename);
  140. /*
  141.     _exit(0);
  142. */
  143.     exit(0);
  144.     /*  no return  */
  145. }
  146.  
  147.  
  148.  
  149. #include "page.h"
  150. #undef sbrk
  151. char *sbrk ();
  152. char *
  153. sbrk1(n)
  154. { char *m1;
  155.   char * m = sbrk(0);
  156. /* printf("Calling sbrk(0x%08x),[cur,rently sbrk(0)=0x%08x,core_end=0x%08x,"
  157.    ,n,m,core_end);
  158.    */
  159.  m1 =  sbrk(n);
  160.  if (core_end && m1!= m)
  161.    { if (m1 < m ||
  162.      ((int)m1 % PAGESIZE))
  163.      { error("unexpected sbrk");
  164.      }
  165.      while ( m < m1)
  166.       {type_map[page(m)] = t_other;
  167.        m += PAGESIZE;
  168.      }
  169.     core_end = m;}
  170. /*  printf("Returning 0x%08x\n",m); */
  171.  return m;}
  172.  
  173.  
  174.